enum MyEnum1 {
  ME1_0 = 0,
  ME1_1 = 1,
  ME1_2 = 2,
  ME1_3 = 3,
  ME1_5 = 5,
  ME1_6 = 6,
}

enum MyEnum2 {
  ME2_0 = 0,
  ME2_1 = 1,
  ME2_2 = 2,
}

enum MyEnum3 {
  ME3_0 = 0,
  ME3_1 = 1,
  ME3_N2 = -2,
  ME3_N1 = -1,
  ME3_D0 = 0,
  ME3_D1 = 1,
  ME3_9 = 9,
  ME3_10 = 10,
} (thrift.duplicate_values)

enum MyEnum4 {
  ME4_A = 0x7ffffffd,
  ME4_B = 0x7ffffffe,
  ME4_C = 0x7fffffff,
  // attempting to define another enum value here fails
  // with an overflow error, as we overflow values that can be
  // represented with an i32.
}

enum MyEnum5 {
  // attempting to explicitly use values out of the i32 range will also fail
  // ME5_A = 0x80000000,
  // ME5_B = 0x100000000,
}

struct MyStruct {
  1: MyEnum2 me2_2 = ME2_2
  2: MyEnum3 me3_n2 = ME3_N2
  3: MyEnum3 me3_d1 = ME3_D1
  4: MyEnum1 me1_t1 = 1
  5: MyEnum1 me1_t2 = ME1_1
  6: MyEnum1 me1_t3 = MyEnum1.ME1_1
}

const MyEnum4 c_me4_a = ME4_A

enum MyEnumUnscoped {
  MEU_A = 4,
  MEU_B = 3,
} (cpp.deprecated_enum_unscoped)

struct MyStructWithForwardRefEnum {
  1: MyForwardRefEnum a = NONZERO,
  2: MyForwardRefEnum b = MyForwardRefEnum.NONZERO,
}

enum MyForwardRefEnum {
  ZERO = 0,
  NONZERO = 12,
}
